iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Security

密碼學小白的學習之路系列 第 5

[Day5] 題目(Intro- 6、7) & Xor 介紹 & Python第三方庫安裝

  • 分享至 

  • xImage
  •  

Python第三方庫安裝

因為之後的題目會用到,所以這邊先安裝一下庫,以下示範為在wins系統安裝的指令

pip install pycryptodome
pip install gmpy2
pip install pwntools

如果在安裝pycryptodome時遇到問題,可以試試

pip uninstall crypto
pip uninstall pycryptodome
pip install pycryptodome

Intro-6 Bytes and Big Integers

https://cryptohack.org/courses/intro/enc4/
https://ithelp.ithome.com.tw/upload/images/20240811/20168165166OoDcr5B.png

題意:

  • 由字元組成的訊息要如何轉換為數字以便於數學運算呢?
  • 最常見的方法是先將訊息轉換為對應的bytes,再將這些bytes轉換為base16,然後將它們串接起來。這樣就可以轉換為一個base16的數字,也可以表示為base10的數字。

解法:

  • 將長整數類型的密文轉換為bytes類型。

hint:

from Crypto.Util.number import  # 從 Crypto.Util.number 模組中引入所有函數和工具
bytes_to_long() #將位元組序列(bytes)轉換為長整數(long integer)
long_to_bytes() #將長整數(long integer)轉換為位元組序列(bytes)

程式碼:

from Crypto.Util.number import *
c=11515195063862318899931685488813747395775516287289682636499965282714637259206269
print(long_to_bytes(c))

crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}
也就是(crypto{encoding_all_the_way_down})

Xor 介紹

在寫xor的題目前,先來了解一下xor。

XOR(Exclusive OR 異或)是一種位元運算,常用於密碼學和資料處理。

1. 運算規則

  • XOR 是一種邏輯運算,對應的運算符號為 ^
  • XOR 的運算規則是:兩個輸入位相同時,結果為0;兩個輸入位不同時,結果為1。
    • 例如:
      • 0 ⊕ 0 = 0
      • 1 ⊕ 0 = 1
      • 0 ⊕ 1 = 1
      • 1 ⊕ 1 = 0

2. 性質

  • Commutative (交換率)A ⊕ B = B ⊕ A
  • Associative (結合率)A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
  • Identity (恆等律)A ⊕ 0 = A
  • Self-Inverse (自反律)A ⊕ A = 0
  • Double Application (雙重應用):如果將相同的數字進行兩次 XOR,會回到原始數值:(A ⊕ B) ⊕ B = A

4. 舉例

  • 假設明文為 1010,密鑰為 1100
    • 加密過程:1010 ⊕ 1100 = 0110
    • 解密過程:0110 ⊕ 1100 = 1010

Intro-7 XOR Starter

https://cryptohack.org/courses/intro/xor0/
https://ithelp.ithome.com.tw/upload/images/20240821/20168165YL3wc29Ol5.png

題意:

  • 介紹xor的運算過程
    * 對兩個十進制的整數進行xor運算,需要先將整數從十進制轉換為二進制,再對它們逐位進行 XOR 操作。
    * 而對字串進行 XOR 操作時,則需要先將每個字元轉換成對應的 Unicode 整數值。

解法:

  • 將題目給定字串label的每個字元與13進行xor運算後,將這些整數轉換回字串。最後將所得字串寫入crypto{}的雙括號中。

hint:

from pwn import xor # 從 pwntools 庫中導入了 xor 函數

程式碼與簡要註解:

#方法一:
from pwn import xor
result=xor('label',13) #使用pwn.xor會得到bytes型別的結果
print(f"crypto{{{result.decode()}}}") #decode():將bytes轉string  #encode():轉為bytes
#bytes型別: 整數序列,每個整數介於0-255(8bits)
#方法二:
result = ''.join(chr(ord(char) ^ 13) for char in 'label')
print(f"crypto{{{result}}}")

crypto{aloha}


參考資料:

後話:

今天查詢並了解了xor,剩下的xor題目明天就可以直接解了。


上一篇
[Day4]題目(Intro- 4、5) & Hex 介紹 & Base64、Base32 簡單介紹
下一篇
[Day 6] 題目(Intro- 8、9)
系列文
密碼學小白的學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言